﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO;
using System.Collections.Generic;
using AccesoDatos.DTO.Base;

namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de MensajeDAO
    /// </summary>
    public class MensajeDAO : BaseDAO, IDAO
    {

        #region Singleton

        private static MensajeDAO instance;

        private MensajeDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de MensajeDAO
        /// </summary>
        /// <returns>instancia de MensajeDAODTO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static MensajeDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new MensajeDAO();
            }

            return instance;
        }

        #endregion

        #region Select

        /// <summary>
        /// Devuelve el listado de clasificaciones que permita el filtro
        /// </summary>
        /// <param name="filtro">FilterBean donde se rellenaran las propiedades por las que se quiere filtrar</param>
        /// <returns>Devuelve una lista de AaiClasificacionDR363FilterBean</returns>
        public List<IDTO> Get(IDTO dto)
        {
            MensajeDTO filtro = new MensajeDTO();
            filtro = (MensajeDTO)dto;
            List<IDTO> lista = new List<IDTO>();
            try
            {
                string sql = @"spu_MensajeDAO_GetMensajes";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoMensaje", GetSqlValue(filtro.CoMensaje));
                cmd.Parameters.AddWithValue("@Titulo", GetSqlValue(filtro.Titulo));
                cmd.Parameters.AddWithValue("@CoPersona", GetSqlValue(filtro.CoPersona));
                cmd.Parameters.AddWithValue("@Contenido", GetSqlValue(filtro.Contenido));
                cmd.Parameters.AddWithValue("@Valoracion", GetSqlValue(filtro.Valoracion));
                cmd.Parameters.AddWithValue("@FchCreacion", GetSqlValue(filtro.FchCreacion));
                cmd.Parameters.AddWithValue("@FchEntrega", GetSqlValue(filtro.FchEntrega));
                cmd.Parameters.AddWithValue("@CoRenglon", GetSqlValue(filtro.CoRenglon));

                
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        MensajeDTO mensaje = new MensajeDTO();
                        mensaje = RellenaBean(dr);
                        lista.Add(mensaje);
                    }
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        #endregion

        #region Insert,Update,Delete


        /// <summary>
        /// Metodo que inserta un registro en la base de datos
        /// </summary>
        /// <param name="filtro">Objeto DTO que contiene todos los parametros</param>
        public void Insert(IDTO dto)
        {
            try
            {
                MensajeDTO filtro = new MensajeDTO();
                filtro = (MensajeDTO)dto;
                string sql = "spu_MensajeDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoMensaje", GetSqlValue(filtro.CoMensaje));
                cmd.Parameters.AddWithValue("@Titulo", GetSqlValue(filtro.Titulo));
                cmd.Parameters.AddWithValue("@CoPersona", GetSqlValue(filtro.CoPersona));
                cmd.Parameters.AddWithValue("@Contenido", GetSqlValue(filtro.Contenido));
                cmd.Parameters.AddWithValue("@Valoracion", GetSqlValue(filtro.Valoracion));
                cmd.Parameters.AddWithValue("@FchCreacion", GetSqlValue(filtro.FchCreacion));
                cmd.Parameters.AddWithValue("@FchEntrega", GetSqlValue(filtro.FchEntrega));
                cmd.Parameters.AddWithValue("@CoRenglon", GetSqlValue(filtro.CoRenglon));
                

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que actualiza un registro de la base de datos
        /// </summary>
        /// <param name="filtro">Objeto DTO que contiene los datos para actualizar el registro</param>
        public void Update(IDTO dto)
        {
            try
            {
                MensajeDTO filtro = new MensajeDTO();
                filtro = (MensajeDTO)dto;
                string sql = "spu_MensajeDAO_Update";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoMensaje", GetSqlValue(filtro.CoMensaje));
                cmd.Parameters.AddWithValue("@Titulo", GetSqlValue(filtro.Titulo));
                cmd.Parameters.AddWithValue("@CoPersona", GetSqlValue(filtro.CoPersona));
                cmd.Parameters.AddWithValue("@Contenido", GetSqlValue(filtro.Contenido));
                cmd.Parameters.AddWithValue("@Valoracion", GetSqlValue(filtro.Valoracion));
                cmd.Parameters.AddWithValue("@FchCreacion", GetSqlValue(filtro.FchCreacion));
                cmd.Parameters.AddWithValue("@FchEntrega", GetSqlValue(filtro.FchEntrega));
                cmd.Parameters.AddWithValue("@CoRenglon", GetSqlValue(filtro.CoRenglon));
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un regitro de la base de datos
        /// </summary>
        public void Delete(IDTO dto)
        {
            try
            {
                MensajeDTO filtro = new MensajeDTO();
                filtro = (MensajeDTO)dto;
                string sql = "spu_mMensajeDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoMensaje", GetSqlValue(filtro.CoMensaje));
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }

        }



        #endregion

        #region Metodos privados

        /// <summary>
        /// Funcion que rellena el bean con los valores obtenidos en DataReader
        /// </summary>
        /// <param name="dr">DataReader que contiene todos los valores directos de la base de datos</param>
        /// <returns>DTO Relleno con los valores obtenidos</returns>
        private MensajeDTO RellenaBean(SqlDataReader dr)
        {
            MensajeDTO bean = new MensajeDTO();
            bean.CoMensaje = this.GetNullableIntFromDataReader(dr, "CO_MENSAJE");
            bean.Titulo = this.GetStringFromDataReader(dr, "TITULO");
            bean.CoPersona = this.GetNullableIntFromDataReader(dr, "CO_PERSONA");
            bean.Contenido = this.GetStringFromDataReader(dr, "CONTENIDO");
            bean.Valoracion = this.GetNullableIntFromDataReader(dr, "VALORACION");
            bean.FchCreacion = this.GetNullableDateTimeFromDataReader(dr, "FCHCREACION");
            bean.FchEntrega = this.GetNullableDateTimeFromDataReader(dr, "FCHENTREGA");
            bean.CoRenglon = this.GetNullableIntFromDataReader(dr, "CO_RENGLON");
           
            return bean;

        }

        #endregion

    }
}